#ifndef _SYS_TIME_H_
#define _SYS_TIME_H_

#include <time.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _TIMEVAL_DEFINED
#define _TIMEVAL_DEFINED
/* \brief 时间值结构体 */
struct timeval {
    long    tv_sec;     /* 秒 */
    long    tv_usec;    /* 微秒 */
};
#endif /* _TIMEVAL_DEFINED */

/* \brief 跳过为 IAR 版本高于 8.10.1（其 __VER__ 为 8010001）的情况定义 timespec */
#if defined ( __ICCARM__ ) && (__VER__ >= 8010001)
#define _TIMESPEC_DEFINED
#endif

#if 0
#ifndef _TIMESPEC_DEFINED
#define _TIMESPEC_DEFINED

/* \brief 时间戳结构体 */
struct timespec {
    time_t  tv_sec;     /* 秒 */
    long    tv_nsec;    /* 纳秒 */
};
#endif /* _TIMESPEC_DEFINED */
#endif

struct timezone {
  int tz_minuteswest;   /* minutes west of Greenwich */
  int tz_dsttime;       /* type of dst correction */
};

/**
 * \brief 获取系统时间
 */
time_t time(time_t *p_timer);
/**
 * \brief 将分解时间（struct tm）转换为日历时间（time_t）
 *
 * @param t 分解时间
 *
 * @return 返回日历时间
 */
time_t mktime(struct tm * const t);
/**
 * \brief 获取当前日期时间
 *
 * @param p_tp     存储时间的结构体
 * @param p_ignore
 *
 * @return 返回秒数
 */
int gettimeofday(struct timeval *p_tp, void *p_ignore);
/**
 * \brief 将日历时间（time_t）转换为分解时间（struct tm）
 *
 * @param p_timep 日历时间
 * @param p_r     存储分解时间的结构体
 *
 * @return 返回分解的时间结构体
 */
struct tm *gmtime_r(const time_t *p_timep, struct tm *p_r);
/**
 * \brief 计算两个 time_t 类型的时间点之间的时间差（以秒为单位）
 *
 * @param time1 结束时间（较晚的时间点）
 * @param time0 起始时间（较早的时间点）
 *
 * @return 返回一个 double 类型的值，表示两个时间之间的秒数差
 */
double difftime(time_t time1, time_t time0);

#ifdef __cplusplus
}
#endif

#endif /* _SYS_TIME_H_ */
